/*
 * @Description: arguments
 * @Author: zzj
 * @Date: 2021-09-08 19:03:25
 * @LastEditors: zzj
 * @LastEditTime: 2021-09-08 19:44:50
 */

//arguments是一个类数组对象，包含着传入函数中的所有参数。arguments主要用途是保存函数参数，但是这个对象还有一个名为callee的属性，该属性是一个指针，指向拥有这个arguments对象的函数。

//length声明时希望的参数的个数
function add(a,b){
    var result = a + b;
    return result;
  }
//   console.log(add.length);//表示函数希望接受的命名参数的个数，即形参的个数。
  Object.getOwnPropertyDescriptor(add,'length');
  add(22,42,12,44);
/*参数：接收实参的快捷方式
	函数外部：实参保存的就是原始数据
	函数内部：arguments保存真正的实参
*/
/*arguments类数组对象
	arguments={
	“0”:1,
	“1”:33,
	“2”:”zs”
	};
	arguments[0],arguments[“1”]
*/

function add(a,b){
    console.log(arguments[0],arguments[1],arguments[2],arguments[3]);
    console.log(a+b);
  }
  add(10);
  //10 undefined undefined undefined
  //NaN
  add(10,20);
  //10 20 undefined undefined
  //30
  add(10,20,30);
  //10 20 30 undefined
  //30
  add(10,20,30,40);
  //10 20 30 40
  //30
  
  foo(10, 20);
  function foo(x, y, z) {
        console.log(foo.length); //3
        console.log(arguments.length); //2		  
        console.log(arguments.callee === foo);//true	  
        console.log(x === arguments[0]);//true
        // 数据共享
        console.log(x);//10
        arguments[0] = 20;
        console.log(x); //20
        x = 30;
        console.log(arguments[0]);//30
        // 不会数据共享
        z = 40;
        console.log(arguments[2]); //undefind
        arguments[2] = 50;
        console.log(z); //40
        console.log(arguments[2]);//50
  }
